
class DBQueue{
    constructor(){
        this.count = 0 //计数器
        this.items = {} //队列的数据仓库
    }
    addBack(...eles){ //在队列尾部增加一项,push
        for(let i = 0, len = eles.length; i < len; i++){
            this.items[this.count] = eles[i] //采用计数器当前值（自然数）为下标key，存储实际数据
            this.count++ //每次push进一个数据，计数器自增1
        }
    }
    removeFront(){ //移除队列当前最前面一项,shift
        if(this.isEmpty()){
            return undefined
        }else{
            let result = this.items[0] //先将队列最前面的那一项保存下来，因为移除了最前面一项，队列后面剩下的所有项都会相应地往前挪一位
            for(let i = 0; i < this.count - 1; i++){
                this.items[i] = this.items[i + 1] //循环将剩下队列的每一项向前挪一位，就是将后一项值赋值给前一项
            }
            delete this.items[this.count - 1] //当剩下所有的项都往前挪了一位，最后一位会赋值给倒数第二位，这样就有两个是相同的，所以删除最后一位
            this.count-- //每次删除一位，相应的计数器要自减1
            return result //返回我们一开始保存好的队列要删除的第一位
        }
    }
    addFront(...eles){ //在队列头部增加一项,unshift
        //之所以写两个循环是因为，第一次往队列里新增1个数，所有的原来的数据相应地往后挪1位，
        //第二次又往队列里新增新1个数，所有的原来队列中的数据又要相应地往后挪1位，依次循环
        for(let e = 0,len = eles.length;e < len; e++){
            for(let i = this.count; i > 0; i--){ //count是计数器，计数器会比下标多1，所以i比原先的数据还要多1位
                this.items[i] = this.items[i - 1] //由上面多1位可知，这里this.items[i]是空值，this.items[i - 1]才是原来最后1位的值
            }
            this.items[0] = eles[e]
            this.count++
        }
    }
    removeBack(){ //在队列尾部删除一项,pop
        if(this.isEmpty()){
            return  undefined
        }else{
            this.count-- //自减1位之后才是最后1位的下标
            let result = this.items[this.count] //将最后一位保存下来
            delete this.items[this.count] //删除最后一位
            return result //并且将删除的最后一位返回出来
        }
    }
    peekFront(){ //返回当前队列最前一位
        if(this.isEmpty()){
            return undefined
        }else{
            return this.items[0]
        }
    }
    peekBack(){ //返回当前队列最后一位
        if(this.isEmpty()){
            return undefined
        }else{
            return this.items[this.count - 1]
        }
    }
    isEmpty(){
        return !this.count
    }
    size(){
        return this.count
    }
    toString(){
        if(this.isEmpty()){
            return ""
        }else{
            let objString = ""
            for(let i = 0; i < this.count; i++){
                objString = `${objString},${this.items[i]}`
            }
            return objString.slice(1)
        }
    }
    [Symbol.iterator](){ //手动添加一个迭代器接口
        let self = this //先保存好当前的this
        let index = 0 //定义一个索引
        return {
            next(){
                if(index < self.count){ //如果没有遍历结束，则一个个返回当前值
                    return {
                        value:self.items[index++], //运用了闭包
                        done:false //false表示没有遍历完成
                    }
                }else{ //否则如果变量结束，则返回undefined
                    return {
                        value:undefined,
                        done:true //true表示遍历结束
                    }
                }
            }
        }
    }
}

/*
* 从人不动花动，转变为花不动人动，两者都是一样的
*
* */
function chuanhua(player,num){
    const xingcunzhe = new DBQueue() //新建一个幸存者双向队列
    const chujuzhe = new DBQueue() //新建一个出局者双向队列
    for(let i = 0;i < player.length; i++){
        xingcunzhe.addBack(player[i])
    }
    while(xingcunzhe.size() > 1){ //只要幸存者还大于1个人，游戏就继续
        for (let i = 0; i < num; i++){
            xingcunzhe.addBack(xingcunzhe.removeFront()) //模拟花不动人动，就是循环将队列最前面的人，删除并添加到队列最后面
        }
        chujuzhe.addBack(xingcunzhe.removeFront()) //每次循环完一圈，就从幸存者队列中删除最后一个，添加到出局者队列的最后一个
        console.log(chujuzhe)
    }
    return {
        fire:chujuzhe,
        winner:xingcunzhe.removeFront()
    }
}

let xingcunzhe = ["万章","哒哒哒","努力睡着","阿仁","长安忆","同学","小飞"]

function randomInt(min,max){
    return Math.floor(Math.random()*(max-min)+min)
}
